package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"html/template"
	"net/http"
	"time"
)

// UnixToTime
//
//	@Description: 时间戳转换为时间字符串
//	@param timestamp
//	@return string
func UnixToTime(timestamp int64) string {
	return time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
}

// GetDouble
//
//	@Description: 获得两倍大小的数
//	@param num
//	@return int
func GetDouble(num int) int {
	return num * 2
}

// main
//
//	@Description: 中间件和控制器之间传递参数、中间件和中间件之间传递参数：
//
// tips:	中间件使用了gorouting  需要使用 c.Copy
func main() {
	r := gin.Default()

	//设置自定义模板函数
	r.SetFuncMap(template.FuncMap{
		"UnixToTime": UnixToTime, //注册模板函数
		"GetDouble":  GetDouble,  //注册模板函数
	})
	r.LoadHTMLGlob("templates/**/*")
	r.Static("/static", "./static")
	//配置路由
	//routers2.UserRouters(r)
	//routers2.CarRouters(r)

	//在中间件1中设置数据，在中间件2中获取数据，中间件1和2之间传递数据
	// 在controller中获取数据
	r.GET("/gin", middleWareMethod00, middleWareMethod01, func(c *gin.Context) {
		time.Sleep(time.Second)
		fmt.Println("access-gin...")
		//获取数据
		accessTime, exists := c.Get("access_time")
		if exists {
			fmt.Println("gin首页：access_time:", accessTime)
		}
		c.String(http.StatusOK, "gin首页:"+accessTime.(string)) //断言~
	})

	r.Run(":8888")
}

func middleWareMethod00(c *gin.Context) {
	start := time.Now().UnixNano()
	fmt.Println("countTime-start...")
	//设置数据
	c.Set("access_time", time.Now().Format("2006-01-02 15:04:05"))
	c.Next()
	end := time.Now().UnixNano()
	fmt.Println("countTime-end...", end-start)
}

func middleWareMethod01(c *gin.Context) {
	fmt.Println("middleWareMethod01-start...")
	//获取数据
	accessTime, exists := c.Get("access_time")
	if exists {
		fmt.Println("middleWareMethod01-access_time:", accessTime)
	}
	fmt.Println("middleWareMethod01-end...")

	//中间件使用了goroutine  需要使用 c.Copy
	cp := c.Copy()
	go printAccessTime(cp)
}

// printAccessTime
//
//	@Description: 协程调用
//	@param c
func printAccessTime(c *gin.Context) {
	time.Sleep(time.Second * 5)
	accessTime, exists := c.Get("access_time")
	if exists {
		fmt.Println("printAccessTime-access_time:", accessTime)
	}
}
